/*
 * @Author: 王灿
 * @Date: 2019-10-27 21:22:47
 * @Description: file content
 */
import axios from 'axios'
import qs from 'qs'
import { throwErr } from './throwErr'
import { Notification, Loading } from 'element-ui'
import { storageGetItem } from '@/utils/index.js'

// 创建axios实例
const service = axios.create({
    baseURL: '', // api的base_url
    timeout: 20000, // 请求超时时间
    headers: {
        'Content-Type': 'application/json',
        Accept: 'application/json'
    }
})

let loadingInstance = null
    // request拦截器
service.interceptors.request.use(
    config => {
        config.baseURL = config.isLogin ?
            process.env.VUE_APP_USER_URL :
            process.env.VUE_APP_BASE_URL


        loadingInstance = Loading.service({
            text: '加载中...',
            customClass: 'el-loading'
        })
        
        // 在请求先展示加载框
        if (!config.data) {
            loadingInstance
        }
        // 配置调试
        handleUrl()

        // 处理请求参数
        handleParams(config)

        // 是否要更改header内容 上传文件
        if (config.isFile) {
            config.headers['Content-Type'] = 'application/x-www-form-urlencoded'
        }

        // 登录接口头部参数
        if (config.url === '/auth/login_4_admin') {
            config.headers['j-session-id'] = config.data.key
        }
        // 用qs处理参数可以处理options请求（预请求），或者设置'Access-Control-MAX-AGE':'1000'
        if (config.method === 'post') {
            // 设置参数拼接方式
            if (
                config.data &&
                config.headers['Content-Type'] === 'application/x-www-form-urlencoded'
            ) {
                config.data = qs.stringify(config.data)
            }
        } else {
            if (config.data) {
                config.url = config.url + '?' + qs.stringify(config.data)
            }
        }
        return config
    },
    error => {
        Promise.reject(error)
    }
)

// respone拦截器
service.interceptors.response.use(
    response => {
        // 请求响应后关闭加载框
        if (loadingInstance) {
            loadingInstance.close()
        }
        // code为非2000是抛错 可结合自己业务进行修改
        if (response.status === 200) {
            if (response.data.code === undefined) {
                return Promise.resolve(response)
            } else {
                const res = response.data
                if (res.code === 2000) {
                    return Promise.resolve(res)
                } else {
                    return throwErr(res)
                }
            }
        } else {
            // 隐藏loading
            return Promise.reject('networkRequestError')
        }
    },
    error => {
        // 请求响应后关闭加载框
        if (loadingInstance) {
            loadingInstance.close()
        }
        // 断网 或者 请求超时 状态
        if (!error.response) {
            // 请求超时状态
            if (error.message.includes('timeout')) {
                Notification.error({
                    title: '提示',
                    message: '请求超时，请检查网络是否连接正常'
                })
            } else {
                // 可以展示断网组件
                Notification.error({
                    title: '提示',
                    message: '请求失败，请检查网络是否已连接'
                })
            }
            return Promise.reject(error)
        } else {
            // status 为500抛异常
            if (error.response.status === 500) {
                Notification.error({
                    title: '提示',
                    message: error.response.data.message
                })
            }
        }
        return Promise.reject(error)
    }
)

// 处理请求参数
function handleParams(config) {
    if (!config.data) {
        // 防止不传参数的情况下，config中没有data属性
        config['data'] = {}
    }

    // 登录不要token
    if (!config.noLogin) {
        // 已登录用户添加接口验证
        if (storageGetItem('accessToken')) {
            config.headers['x-jq-platform'] = storageGetItem('type')
            config.headers['x-jq-access-token'] = storageGetItem('accessToken')
            config.headers['x-jq-user-id'] = storageGetItem('userId')
        }
    }

    // 合并请求参数
    if (config.params) {
        config.data = {
            ...config.data,
            ...config.params
        }
    }
}

// 处理调试模式下，端口问题
function handleUrl() {
    if (process.env.NODE_ENV !== 'debugger') {
        return
    }
}

export default service